﻿using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System;

/// <summary>
/// 网络返回类型
/// </summary>
public enum Net_Result_Type
{
    Net_Success,
    Net_Error_Timeout,
    Net_Error_MsgFormat,
    Net_Error_Translate,
}
//Socket网络类型
public enum SocketState : int
{
    NONE,
    Create,
    Connecting,
    Working,//网络正常状态
    Close,
    Error,
}

/*
 ConnectManager。它维护一个Connection实例列表。这些实例根据底层通讯接口的不同，
 有多种类型。Connection封装了数据的收发逻辑，它分别为Send和Receive提供Buffer。它主要实现以下功能：

　　创建连接。这部分功能主要在XXConnection类实现，不同的通讯接口，连接方式不同。比如Apollo的通讯接口，
需要提供公司的一揽子参数。而Bluetooth接口而需要提供BluetoothMacAddress。而采用底层的Socket实现的UDP通
讯接口，则无须Connect过程，那么我们就给它虚拟一个假的Connect过程，以保持IConnection接口的统一性。等等等等。

　　收发数据。大部分通讯接口对数据的Recv是通过轮询实现的，在ConnectManager里将轮询操作统一转换为事件方式。

　　断线重连。Connection分别为Send和Recv提供了Buffer，以便支持静默重连，
使上层逻辑在大部分情况下无须关心网络是否断开，也可以发送数据。比如，网络突然断开了，假设A模块不负责维护在
线状态，那么在它看来，它依然可以正常发送数据。假设B模块负责维护在线状态，那么它应该监听到网络断开，然后进
行重连，最后重连成功。在网络重连成功后，缓存在Connection的数据，就可以发送出去了。整个过程，对A模块是不可
感知的。（是不是觉得断线静默重连也没有想像中那么复杂了？）
     
    火影手游的PVP网络模块是专用的网络模块 帧同步
*/

public enum ConnectType
{
    TCPConnect=1,
    UDPConnect,
    HttpConnect,
    BluetoothConnect,
    ApolloConnect,
}

/// <summary>
/// 一般性网络框架 网络最上层接口 ,封装简单易用的接口
/// </summary>
public class NetMng:NorSingleton<NetMng>
{
    Dictionary<ConnectType, IConnection> dictConn = new Dictionary<ConnectType, IConnection>();

    IConnection currConnection;

    List<DataPacket> datalist = new List<DataPacket>();
    protected override void OnInit()
    {
        base.OnInit();
    }

    /// <summary>
    /// 存入一条网络命令
    /// </summary>
    /// <param name="data"></param>
    public void PushData(DataPacket data)
    {
        datalist.Add(data);
    }

    void Update()
    {
            //进行逻辑执行
          if( currConnection.DataList.Count>0)
            {
                //TODOLogic
                for (int i = 0; i < currConnection.DataList.Count; i++)
                {
                    DataPacket packet = currConnection.DataList[0];
                    Debug.Log("处理消息 =" + packet.PID + " inedex="+packet.index + " Message :" + packet.DataBuff);
                    currConnection.DataList.RemoveAt(0);
                }
                  
            }    
    }

    private void CreateConnection(int connid, ConnectType type,string ip ,int port)
    {
        switch (type)
        {
            case ConnectType.TCPConnect:
                if (dictConn.ContainsKey(ConnectType.TCPConnect))
                    currConnection = dictConn[ConnectType.TCPConnect];
                else
                {
                    currConnection = new TCPConnection("127.0.0.1", 6550);
                    dictConn[ConnectType.TCPConnect] = currConnection;
                }
                break;
            case ConnectType.UDPConnect:
                break;
            case ConnectType.HttpConnect:
                break;
            case ConnectType.BluetoothConnect:
                break;
            case ConnectType.ApolloConnect:
                break;
            default:
                break;
        }
    }
    public void DisposeConnection(int connid)
    {

    }

    public void SendData(int connId,byte[] data)
    {
        currConnection.Send()
    }


    

    public void AddDataListenr(Action listener)
    {

    }
    
    public void RemoveDataListener(Action listner)
    {

    }

    private void DoRecvData()
    {

    }
}
